package com.trade.module.database.basic;

import com.alibaba.druid.pool.DruidDataSource;
import lombok.extern.log4j.Log4j;

import javax.annotation.PreDestroy;
import java.sql.SQLException;

/**
 * @Desc: 自定义数据源
 * @Version: v1.0 2017/12/6 10:40
 * @Author: zfb
 * @JDK Version: 1.8.0_51
 */
@Log4j
@SuppressWarnings("all")
public class CustomDataSource {

    private DruidDataSource dds = new DruidDataSource();

    public CustomDataSource(String driverName, String dbUrl, String userName, String password, int connPollSize) throws SQLException {
        // 配置连接信息
        this.dds.setDriverClassName(driverName);
        this.dds.setUrl(dbUrl);
        this.dds.setUsername(userName);
        this.dds.setPassword(password);

        // 配置初始化大小、最小、最大
        this.dds.setInitialSize(connPollSize <= 0?5:connPollSize);
        this.dds.setMinIdle(10);
        this.dds.setMaxActive(20);

        // 连接泄漏处理。Druid提供了RemoveAbandonded相关配置，用来关闭长时间不使用的连接（例如忘记关闭连接）
        this.dds.setRemoveAbandoned(true);
        this.dds.setRemoveAbandonedTimeout(180);  //设置检测空连接时长，单位:秒
        this.dds.setLogAbandoned(true); //关闭abanded连接时输出错误日志

        // 配置获取连接等待超时的时间,单位：毫秒
        this.dds.setMaxWait(60000);

        // 配置间隔多久才进行一次检测，检测需要关闭的空闲连接，单位:毫秒
        this.dds.setTimeBetweenEvictionRunsMillis(300000);

        // 打开PSCache，并且指定每个连接上PSCache的大小;
        // 如果用Oracle，则把poolPreparedStatements配置为true，mysql可以配置为false。分库分表较多的数据库，建议配置为false
        this.dds.setPoolPreparedStatements(true);
        this.dds.setMaxPoolPreparedStatementPerConnectionSize(20);
        // 配置监控统计拦截的filters, 监控统计："stat",防SQL注入："wall",组合使用： "stat,wall"
        this.dds.setFilters("stat,wall");
    }

    public DruidDataSource getDds() {
        return dds;
    }

    public void setDds(DruidDataSource dds) {
        this.dds = dds;
    }

    /**
     * 前置销毁数据源
     * @throws SQLException sql异常
     */
    @PreDestroy
    public void preDestroy() throws SQLException {
        this.dds.close();

    }

    /**
     * 关闭连接
     * @throws SQLException sql异常
     */
    public void closeDataSource() throws SQLException {
        this.dds.close();
    }

}
